package co.edu.udea.xyz.dao.hibernate;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.xyz.dao.EmpleadoDAO;
import co.edu.udea.xyz.dto.Empleado;
import co.edu.udea.xyz.util.exception.XYZException;
/**
 * Clase EmpleadoDAOHibernate 
 * Hereda HibernateDaoSupport
 * Implementa EmpleadoDAO
 * 
 * Contiene los metodos para el manejo de los Empleados
 * @author CesarGuapacha
 *
 */
public class EmpleadoDAOHibernate extends HibernateDaoSupport implements
		EmpleadoDAO {

	public EmpleadoDAOHibernate() {
		
	}

	/**
	 * Metodo para obtener una lista de Empleados
	 * que contiene la tabla EMPLEADOS de la Base de Datos.
	 */
	@Override
	public List<Empleado> obtener() throws XYZException {
		Session session = null;
		List<Empleado> empleados = new ArrayList<Empleado>();
		
		try{
			session = getSession();
			Criteria criteria = session.createCriteria(Empleado.class);
			empleados = criteria.list();
		}catch(HibernateException e){
			throw new 	XYZException(e);
		}
		return empleados;
	}

	/**
	 * Metodo Obtener Empleado segun su idEmpleado.
	 * @param IdEmpleado
	 * @return empleado
	 */
	@Override
	public Empleado obtener(int idEmpleado) throws XYZException {
		Session session = null;
		Empleado empleado = null;
		
		try{
			session = getSession();
			empleado = (Empleado)session.get(Empleado.class, idEmpleado);
		}catch(HibernateException e){
			throw new XYZException(e);
		}
		return empleado;
	}

	/**
	 * Metodo que guarda un empleado en la base de datos
	 * @param Empleado
	 */
	@Override
	public void guardar(Empleado empleado) throws XYZException {
		Session session = null;
		Transaction tx = null;
		
		try{
			session = getSession();
			tx = session.beginTransaction();
			session.save(empleado);
						
		}catch(HibernateException e){
			throw new XYZException(e);
		}

	}

	/**
	 * Metodo que actualiza un Empleado en la base de datos
	 * @param Empleado
	 */
	@Override
	public void actualizar(Empleado empleado) throws XYZException {
		Session session = null;
		Transaction tx = null;
		
		try{
			session = getSession();
			tx = session.beginTransaction();
			session.update(empleado);
			
		}catch(HibernateException e){
			throw new XYZException(e);
		}

	}

	
	/**
	 * Metodo Obtener Empleado segun su login.
	 * @param login de empleado
	 * @return empleado
	 */
	@Override
	public Empleado obtener(String login) throws XYZException {
		Criteria criteria = null;
		Empleado empleado = null;
		Session session = null;
		
		try{
			
			session = getSession();
			criteria = session.createCriteria(Empleado.class);
			criteria.add(Restrictions.eq("login", login));
			empleado = (Empleado) criteria.uniqueResult();
			
			//empleado = (Empleado)session.get(Empleado.class, login);
		}catch(HibernateException e){
			throw new XYZException(e);
		}
		return empleado;
	}

}
